package com.Cychat.AI.controller;

import com.Cychat.AI.entity.ai.SessionMessages;
import com.Cychat.AI.service.AIService;
import com.Cychat.AI.tools.DoctorTools;
import com.Cychat.AI.tools.MallTools;
import com.Cychat.AI.tools.PetTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * Auther: 谢宝辉  <br/>
 * Date: 2025/10/28:10:07  <br/>
 * Description:AI问答
 */
@RestController
@RequestMapping("/api/ai")
@Slf4j
@CrossOrigin
public class AIChatController {

    @Autowired
    private ChatClient chatClient;

    @Autowired
    private AIService aiService;

    @Autowired
    private PetTools petTools;

    @Autowired
    private DoctorTools doctorTools;

    @Autowired
    private MallTools mallTools;



    /**
     * Description : 流式问答, 支持图片问答
     * ChangeLog : 1. 创建 (2025/10/30 15:53 [Lenovo]);
     * @auther: 谢宝辉
     * date: 2025/10/30:15:53
     * @param messages
     * @return reactor.core.publisher.Flux<java.lang.String>
    */

    @PostMapping(value = "/stream/{userId}", produces = "text/event-stream")
    public Flux<String> stream(@PathVariable("userId") Long userId, @RequestBody SessionMessages messages) {
        String userQuestion = messages.getQuestion(); // 用户原问题
        List<String> ossImageUrls = messages.getFilesPath(); // 前端传的OSS URL列表（1张/多张/空）

        //将userId注入到工具类
        doctorTools.setUserId(userId);
        petTools.setUserId(userId);

        // 1. 统一调用图片处理方法（无需判断数量）
        Flux<String> allImagesDesc = aiService.processImages(userQuestion, ossImageUrls)
                .onErrorResume(e -> {
                    log.error("图片处理异常：", e);
                    return Flux.just("【图片处理异常：" + e.getMessage().substring(0, 20) + "】");
                });

        // 2. 合并“图片描述+用户问题”，调用大模型生成最终回答
        return allImagesDesc.flatMap(imagesDesc -> {
            // 构建最终提问（空描述时直接用原问题，有描述时拼接）
            String finalPrompt = imagesDesc.isEmpty()
                    ? userQuestion
                    : "以下是图片内容描述：\n" + imagesDesc + "\n\n请结合上述图片，回答用户问题：" + userQuestion;

            // 调用大模型（流式返回逻辑不变）
            UserMessage userMsg = new UserMessage(finalPrompt);
            return chatClient.prompt(new Prompt(List.of(userMsg)))
                    .tools(petTools)
                    .tools(doctorTools)
                    .tools(mallTools)
                    .stream()
                    .content();
        });
    }
}
